package com.herench.bs.transfer;

import org.apache.cxf.endpoint.Client;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 获取患者电子住院证
 *
 * @author liuxiaohui
 * @date 2019/3/26
 */
public class GetInpNoticeTransfer extends AbstractTransfer {
    public GetInpNoticeTransfer(String method, Client client, String messageMethod) {
        super(method, client, messageMethod);
    }

    /**
     * 发送：微信前端JSON数据转换为HIS用的XML数据（微信前端==》HIS）
     * @param params
     * @return
     * @throws Exception
     */
    @Override
    public String toInvokeMessage(Map<String, Object> params) throws Exception {
        // 患者ID
        String patientId = (String) params.get("patientId");
        // 身份证号
        String idNo = (String) params.get("idNo");

        // 交易ID：his的方法名
        Document document = getTplDoc(getMethod());

        // 将各个入参数设值（入参==》XML）
        Element dataRow = document.getRootElement().element("CommitData").addElement("Data").addElement("DataRow");
        // 身份证号
        dataRow.addAttribute("ID_NO", idNo);
        // 患者ID
        dataRow.addAttribute("PATIENT_ID", patientId);

        return document.asXML();
    }

    /**
     * 接收：HIS返回的XML数据并转换为JSON（HIS==》微信前端）
     * @param resMsg
     * @return
     * @throws Exception
     */
    @Override
    public Map<String, Object> toResultMessage(String resMsg) throws Exception {
        Map<String, Object> resMap = new HashMap<>(16);
        Document document = DocumentHelper.parseText(resMsg);

        Element resultInfo = document.getRootElement().element("Result").element("Info");
        String executeStatus = resultInfo.attributeValue("EXECUTE_STATUS");
        String executeMessage = resultInfo.attributeValue("EXECUTE_MESSAGE");
        List<Map<String, Object>> dataList = new ArrayList<>();

        if (Dialect.getSuccessfulState().equals(executeStatus)) {
            // 获取各个参数的值（出参的树状结构：父==》子）
            // 取得数据为数组形式
            List<Element> dataRowList = document.getRootElement().element("ReturnData").element("Data").elements();

            if (dataRowList == null || dataRowList.size() == 0) {
                resMap.put("code", "1403");
                resMap.put("message", "调用成功，但是获取的数据为 0 件！");
            } else {
                for (Element dataRow : dataRowList) {
                    Map<String, Object> subMap = new HashMap<>(16);
                    DoAppointInHosInnerMessage innerMessage = new DoAppointInHosInnerMessage(dataRow);
                    // 患者ID
                    subMap.put("patientId", innerMessage.getPatientId());
                    // 入院次数
                    subMap.put("visitId", innerMessage.getVisitId());
                    // 患者姓名
                    subMap.put("patientName", innerMessage.getPatientName());
                    // 性别
                    subMap.put("sex", innerMessage.getSex());
                    // 出生日期
                    subMap.put("birthDate", innerMessage.getBirthDate());
                    // 身份证号
                    subMap.put("idNo", innerMessage.getIdNo());
                    // 医保卡号
                    subMap.put("insurNo", innerMessage.getInsurNo());
                    // 开证时间
                    subMap.put("enterDateTime", innerMessage.getEnterDateTime());
                    // 开证医生
                    subMap.put("enterDoctor", innerMessage.getEnterDoctor());
                    // 押金金额
                    subMap.put("prepayment", innerMessage.getPrepayment());
                    // 是否已办理入院
                    subMap.put("isInhos", innerMessage.getIsInhos());
                    // 有效日期
                    subMap.put("validityDate", innerMessage.getValidityDate());
                    // 入院科室编码
                    subMap.put("inDept", innerMessage.getInDept());
                    // 入院科室名称
                    subMap.put("inDeptName", innerMessage.getInDeptName());
                    // 入院科室位置
                    subMap.put("deptLocation", innerMessage.getDeptLocation());
                    // 门诊诊断
                    subMap.put("clinicDiagnosis", innerMessage.getClinicDiagnosis());
                    // 门诊
                    subMap.put("clinicId", innerMessage.getClinicId());
                    // 患者电话号
                    subMap.put("phoneNumberHome", innerMessage.getPnoneNumberHome());
                    // 现住址
                    subMap.put("currentAddress", innerMessage.getCurrentAddress());
                    // 是否急诊：1:急诊;0:非急诊
                    resMap.put("isJz", innerMessage.getIsJz());

                    // 追加一行数据到List
                    dataList.add(subMap);
                }

                // 返回所有行数据
                resMap.put("dataList", dataList);

                // 返回Code
                resMap.put("code", executeStatus);
                // 返回信息
                resMap.put("message", "成功！");
            }
        } else {
            resMap.put("code", executeStatus);
            resMap.put("message", executeMessage);
        }
        return resMap;
    }

    public class DoAppointInHosInnerMessage implements InnerMessage{
        /**
         * 患者ID
         */
        private String patientId;
        /**
         * 入院次数
         */
        private String visitId;
        /**
         * 患者姓名
         */
        private String patientName;
        /**
         * 性别
         */
        private String sex;
        /**
         * 出生日期
         */
        private String birthDate;
        /**
         * 身份证号
         */
        private String idNo;
        /**
         * 医保卡号
         */
        private String insurNo;
        /**
         * 开证时间
         */
        private String enterDateTime;
        /**
         * 开证医生
         */
        private String enterDoctor;
        /**
         * 押金金额
         */
        private String prepayment;
        /**
         * 是否已办理入院
         */
        private String isInhos;
        /**
         * 有效日期
         */
        private String validityDate;
        /**
         * 入院科室编码
         */
        private String inDept;
        /**
         * 入院科室名称
         */
        private String inDeptName;
        /**
         * 入院科室位置
         */
        private String deptLocation;
        /**
         * 门诊诊断
         */
        private String clinicDiagnosis;
        /**
         * 门诊
         */
        private String clinicId;
        /**
         * 患者电话号
         */
        private String phoneNumberHome;
        /**
         * 现住
         */
        private String currentAddress;
        /**
         * 是否急
         */
        private String isJz;



        public DoAppointInHosInnerMessage(Element element) {
            // 患者ID
            this.patientId = element.attributeValue("PATIENT_ID");
            // 入院次数
            this.visitId = element.attributeValue("VISIT_ID");
            // 患者姓名
            this.patientName = element.attributeValue("PATIENT_NAME");
            // 性别
            this.sex = element.attributeValue("SEX");
            // 出生日期
            this.birthDate = element.attributeValue("BIRTH_DATE");
            // 身份证号
            this.idNo = element.attributeValue("ID_NO");
            // 医保卡号
            this.insurNo = element.attributeValue("INSUR_NO");
            // 开证时间
            this.enterDateTime = element.attributeValue("ENTER_DATE_TIME");
            // 开证医生
            this.enterDoctor = element.attributeValue("ENTER_DOCTOR");
            // 押金金额
            this.prepayment = element.attributeValue("PREPAYMENT");
            // 是否已办理入院
            this.isInhos = element.attributeValue("IS_INHOS");
            // 有效日期
            this.validityDate = element.attributeValue("VALIDITY_DATE");
            // 入院科室编码
            this.inDept = element.attributeValue("IN_DEPT");
            // 入院科室名称
            this.inDeptName = element.attributeValue("IN_DEPT_NAME");
            // 入院科室位置
            this.deptLocation = element.attributeValue("DEPT_LOCATION");
            // 门诊诊断
            this.clinicDiagnosis = element.attributeValue("CLINIC_DIAGNOSIS");
            // 门诊
            this.clinicId = element.attributeValue("CLINIC_ID");
            // 患者电话号
            this.phoneNumberHome = element.attributeValue("PHONE_NUMBER_HOME");
            // 现住址
            this.currentAddress = element.attributeValue("CURRENT_ADDRESS");
            // 是否急诊
            this.isJz = element.attributeValue("IS_JZ");

        }

        /**
         * 患者ID
         */
        public String getPatientId() {
            return patientId;
        }
        /**
         * 入院次数
         */
        public String getVisitId() {
            return visitId;
        }
        /**
         * 患者姓名
         */
        public String getPatientName() {
            return patientName;
        }
        /**
         * 性别
         */
        public String getSex() {
            return sex;
        }
        /**
         * 出生日期
         */
        public String getBirthDate() {
            return birthDate;
        }
        /**
         * 身份证号
         */
        public String getIdNo() {
            return idNo;
        }
        /**
         * 医保卡号
         */
        public String getInsurNo() {
            return insurNo;
        }
        /**
         * 开证时间
         */
        public String getEnterDateTime() {
            return enterDateTime;
        }
        /**
         * 开证医生
         */
        public String getEnterDoctor() {
            return enterDoctor;
        }
        /**
         * 押金金额
         */
        public String getPrepayment() {
            return prepayment;
        }
        /**
         * 是否已办理入院
         */
        public String getIsInhos() {
            return isInhos;
        }
        /**
         * 有效日期
         */
        public String getValidityDate() {
            return validityDate;
        }
        /**
         * 入院科室编码
         */
        public String getInDept() {
            return inDept;
        }
        /**
         * 入院科室名称
         */
        public String getInDeptName() {
            return inDeptName;
        }


        /**
         * 入院科室位置
         */
        public String getDeptLocation() {
            return deptLocation;
        }
        /**
         * 门诊诊断
         */
        public String getClinicDiagnosis() {
            return clinicDiagnosis;
        }
        /**
         * 门诊
         */
        public String getClinicId() {
            return clinicId;
        }
        /**
         * 患者电话号
         */
        public String getPnoneNumberHome() {
            return phoneNumberHome;
        }
        /**
         * 现住
         */
        public String getCurrentAddress() {
            return currentAddress;
        }
        /**
         * 是否急
         */
        public String getIsJz() {
            return isJz;
        }


    }
}
